package br.com.unip.visao;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.DefaultTableModel;

import br.com.unip.modelo.Departamento;
import br.com.unip.modelo.Funcionario;
import br.com.unip.modelo.Participa;
import br.com.unip.modelo.Projeto;
import br.com.unip.persistencia.DepartamentoDao;
import br.com.unip.persistencia.FuncionarioDao;
import br.com.unip.persistencia.ParticipaDao;
import br.com.unip.persistencia.ProjetoDao;

public class AppListGui extends JFrame {
	private static final long serialVersionUID = 1L;
	
	// Funcionário
	private JPanel panelListaFunc, panelListaFuncTable, panelListaFuncBtn;
	final DefaultTableModel tableModelListaFunc = new DefaultTableModel();
	private JTable tableListaFunc;
	private JScrollPane scrolTableListaFunc;
	private JButton btnInserirFunc, btnAlterarFunc, btnDeletarFunc;
	
	// Projeto
	private JPanel panelListaProj, panelListaProjTable, panelListaProjBtn;
	final DefaultTableModel tableModelListaProj = new DefaultTableModel();
	private JTable tableListaProj;
	private JScrollPane scrolTableListaProj;
	private JButton btnInserirProj, btnAlterarProj, btnDeletarProj;
	
	// Departamento
	private JPanel panelListaDepto, panelListaDeptoTable, panelListaDeptoBtn;
	final DefaultTableModel tableModelListaDepto = new DefaultTableModel();
	private JTable tableListaDepto;
	private JScrollPane scrolTableListaDepto;
	private JButton btnInserirDepto, btnAlterarDepto, btnDeletarDepto;
	
	// Participa
	private JPanel panelListaPartic, panelListaParticTable, panelListaParticBtn;
	final DefaultTableModel tableModelListaPartic = new DefaultTableModel();
	private JTable tableListaPartic;
	private JScrollPane scrolTableListaPartic;
	private JButton btnInserirPartic, btnAlterarPartic, btnDeletarPartic;
	
	static JTabbedPane paneLista;
	
	public AppListGui() {
		super("Projeto Unip (SWING) - Listas");
		
		MontaListaFunc();
		MontaListaProj();
		MontaDepto();
		MontaPartic();
		
		paneLista = new JTabbedPane();
		paneLista.addTab("Lista de Funcionários", null, panelListaFunc, "Lista de Funcionários");
		paneLista.addTab("Lista de Projetos", null, panelListaProj, "Lista de Projetos");
		paneLista.addTab("Lista de Departamentos", null, panelListaDepto, "Lista de Departamentos");
		paneLista.addTab("Lista de Participantes", null, panelListaPartic, "Lista de Participantes");
		
		paneLista.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent ce) {
				int tabNumber = paneLista.getSelectedIndex();
				if (tabNumber == 0) {
					try {
						FuncionarioDao fd = new FuncionarioDao();
						List<Funcionario> listar = fd.listar();
						
						// Reseta a tabela antes de popular
						DefaultTableModel dtm = (DefaultTableModel)tableListaFunc.getModel();
						dtm.getDataVector().removeAllElements();
						
						for (Funcionario rp : listar) {
							tableModelListaFunc.addRow(new Object[] {
									rp.getCod_func(), rp.getNome(),
									rp.getDataNascimento(), rp.getSalario(),
									rp.getNumeroDepartamento(),
									rp.getCodigoSupervisor() });
						}
						
					} catch (Exception e) {
						JOptionPane.showMessageDialog(null, "Erro : "
								+ e.getMessage(), "Atenção!",
								JOptionPane.ERROR_MESSAGE);
					}
				}
				if (tabNumber == 1) {
					try {
						ProjetoDao pd = new ProjetoDao();
						List<Projeto> listar = pd.listar();
						
						// Reseta a tabela antes de popular
						DefaultTableModel dtm = (DefaultTableModel)tableListaProj.getModel();
						dtm.getDataVector().removeAllElements();
						
						for (Projeto rp : listar) {
							tableModelListaProj.addRow(new Object[] {
									rp.getCod_proj(), rp.getNome(),
									rp.getDuracao(), rp.getNro_depto() });
						}
					} catch (Exception e) {
						JOptionPane.showMessageDialog(null, "Erro : "
								+ e.getMessage(), "Atenção!",
								JOptionPane.ERROR_MESSAGE);
					}
				}
				if (tabNumber == 2) {
					try {
						DepartamentoDao dd = new DepartamentoDao();
						List<Departamento> listar = dd.listar();
						
						// Reseta a tabela antes de popular
						DefaultTableModel dtm = (DefaultTableModel)tableListaDepto.getModel();
						dtm.getDataVector().removeAllElements();

						for (Departamento rp : listar) {
							tableModelListaDepto.addRow(new Object[] {
									rp.getNro_dpto(), rp.getNome(),
									rp.getCod_ger() });
						}
					} catch (Exception e) {
						JOptionPane.showMessageDialog(null,
								"Erro : " + e.getMessage(), "Atenção!",
								JOptionPane.ERROR_MESSAGE);
					}
				}
				if (tabNumber == 3) {
					try {
						ParticipaDao pd = new ParticipaDao();
						List<Participa> listar = pd.listar();
						
						// Reseta a tabela antes de popular
						DefaultTableModel dtm = (DefaultTableModel)tableListaPartic.getModel();
						dtm.getDataVector().removeAllElements();
						
						for (Participa rp : listar) {
							tableModelListaPartic.addRow(new Object[] {
									rp.getCod_proj(), rp.getCod_func(),
									rp.getHoras_trab() });
						}
					} catch (Exception e) {
						JOptionPane.showMessageDialog(null, "Erro : "
								+ e.getMessage(), "Atenção!",
								JOptionPane.ERROR_MESSAGE);
					}
				}
			}
		});
		
		add(paneLista);
		
		this.setResizable(false);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(700, 500);
		this.setLocationRelativeTo(null);
		this.setVisible(true);
	}
	
	public void MontaListaFunc() {
		tableListaFunc = new JTable(tableModelListaFunc);

		tableModelListaFunc.addColumn("ID");
		tableModelListaFunc.addColumn("Nome");
		tableModelListaFunc.addColumn("Nascimento");
		tableModelListaFunc.addColumn("Salário");
		tableModelListaFunc.addColumn("Departamento");
		tableModelListaFunc.addColumn("Supervisor");

		scrolTableListaFunc = new JScrollPane(tableListaFunc);
		
		btnInserirFunc = new JButton("Inserir");
		btnAlterarFunc = new JButton("Alterar");
		btnDeletarFunc = new JButton("Deletar");
		
		panelListaFuncTable = new JPanel(new GridLayout(1,1));
		panelListaFuncTable.add(scrolTableListaFunc);
		
		panelListaFuncBtn = new JPanel(new GridLayout(1,3));
		panelListaFuncBtn.add(btnInserirFunc);
		panelListaFuncBtn.add(btnAlterarFunc);
		panelListaFuncBtn.add(btnDeletarFunc);
		
		panelListaFunc = new JPanel(new BorderLayout());
		panelListaFunc.add(panelListaFuncTable, BorderLayout.PAGE_START);
		panelListaFunc.add(panelListaFuncBtn, BorderLayout.CENTER);
		
		btnDeletarFunc.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				try {
					int id = Integer.parseInt(tableListaFunc.getValueAt(
							tableListaFunc.getSelectedRow(), 0).toString());
					FuncionarioDao fd = new FuncionarioDao();
					try {
						fd.deletar(id);
						JOptionPane.showMessageDialog(null, "Registro " + id
								+ " deletado com sucesso!", "Sucesso",
								JOptionPane.INFORMATION_MESSAGE);
						
						// Gambiarra que tem que ser arrumada! o.O (sem net para pesquisar)
						paneLista.setSelectedIndex(1);
						paneLista.setSelectedIndex(0);
					} catch (Exception e) {
						JOptionPane.showMessageDialog(null,
								"Erro : " + e.getMessage(), "Atenção!",
								JOptionPane.ERROR_MESSAGE);
					}
				} catch (Exception e) {
					JOptionPane.showMessageDialog(null,
							"Selecione 1 (um) registro. Erro : " + e.getMessage(), "Atenção!",
							JOptionPane.ERROR_MESSAGE);
				}
			}
		});
		btnAlterarFunc.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				try {
					int id = Integer.parseInt(tableListaFunc.getValueAt(
							tableListaFunc.getSelectedRow(), 0).toString());
					
					new AppFuncionarioAlterarGui(id);
				} catch (Exception e) {
					JOptionPane.showMessageDialog(null,
							"Erro : " + e.getMessage(), "Atenção!",
							JOptionPane.ERROR_MESSAGE);
				}
			}
		});
		btnInserirFunc.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				new AppFuncionarioNovoGui();
			}
		});
	}
	
	public void MontaListaProj() {
		tableListaProj = new JTable(tableModelListaProj);

		tableModelListaProj.addColumn("ID");
		tableModelListaProj.addColumn("Nome");
		tableModelListaProj.addColumn("Duração");
		tableModelListaProj.addColumn("Departamento");

		scrolTableListaProj = new JScrollPane(tableListaProj);
		
		btnInserirProj = new JButton("Inserir");
		btnAlterarProj = new JButton("Alterar");
		btnDeletarProj = new JButton("Deletar");
		
		panelListaProjTable = new JPanel(new GridLayout(1,1));
		panelListaProjTable.add(scrolTableListaProj);
		
		panelListaProjBtn = new JPanel(new GridLayout(1,3));
		panelListaProjBtn.add(btnInserirProj);
		panelListaProjBtn.add(btnAlterarProj);
		panelListaProjBtn.add(btnDeletarProj);
		
		panelListaProj = new JPanel(new BorderLayout());
		panelListaProj.add(panelListaProjTable, BorderLayout.PAGE_START);
		panelListaProj.add(panelListaProjBtn, BorderLayout.CENTER);
		
		btnDeletarProj.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				try {
					int id = Integer.parseInt(tableListaProj.getValueAt(
							tableListaProj.getSelectedRow(), 0).toString());
					ProjetoDao fd = new ProjetoDao();
					try {
						fd.deletar(id);
						JOptionPane.showMessageDialog(null, "Registro " + id
								+ " deletado com sucesso!", "Sucesso",
								JOptionPane.INFORMATION_MESSAGE);
						
						// Gambiarra que tem que ser arrumada! o.O (sem net para pesquisar)
						paneLista.setSelectedIndex(0);
						paneLista.setSelectedIndex(1);
					} catch (Exception e) {
						JOptionPane.showMessageDialog(null,
								"Erro : " + e.getMessage(), "Atenção!",
								JOptionPane.ERROR_MESSAGE);
					}
				} catch (Exception e) {
					JOptionPane.showMessageDialog(null,
							"Selecione 1 (um) registro. Erro : " + e.getMessage(), "Atenção!",
							JOptionPane.ERROR_MESSAGE);
				}
			}
		});
		btnInserirProj.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				new AppProjetoNovoGui();
			}
		});
	}
	
	public void MontaDepto() {
		tableListaDepto = new JTable(tableModelListaDepto);

		tableModelListaDepto.addColumn("ID");
		tableModelListaDepto.addColumn("Nome");
		tableModelListaDepto.addColumn("Gerente");

		scrolTableListaDepto = new JScrollPane(tableListaDepto);
		
		btnInserirDepto = new JButton("Inserir");
		btnAlterarDepto = new JButton("Alterar");
		btnDeletarDepto = new JButton("Deletar");
		
		panelListaDeptoTable = new JPanel(new GridLayout(1,1));
		panelListaDeptoTable.add(scrolTableListaDepto);
		
		panelListaDeptoBtn = new JPanel(new GridLayout(1,2));
		panelListaDeptoBtn.add(btnInserirDepto);
		panelListaDeptoBtn.add(btnAlterarDepto);
		panelListaDeptoBtn.add(btnDeletarDepto);
		
		panelListaDepto = new JPanel(new BorderLayout());
		panelListaDepto.add(panelListaDeptoTable, BorderLayout.PAGE_START);
		panelListaDepto.add(panelListaDeptoBtn, BorderLayout.CENTER);
		
		btnDeletarDepto.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				try {
					int id = Integer.parseInt(tableListaDepto.getValueAt(
							tableListaDepto.getSelectedRow(), 0).toString());
					DepartamentoDao fd = new DepartamentoDao();
					try {
						fd.deletar(id);
						JOptionPane.showMessageDialog(null, "Registro " + id
								+ " deletado com sucesso!", "Sucesso",
								JOptionPane.INFORMATION_MESSAGE);
						
						// Gambiarra que tem que ser arrumada! o.O (sem net para pesquisar)
						paneLista.setSelectedIndex(1);
						paneLista.setSelectedIndex(2);
					} catch (Exception e) {
						JOptionPane.showMessageDialog(null,
								"Erro : " + e.getMessage(), "Atenção!",
								JOptionPane.ERROR_MESSAGE);
					}
				} catch (Exception e) {
					JOptionPane.showMessageDialog(null,
							"Selecione 1 (um) registro. Erro : " + e.getMessage(), "Atenção!",
							JOptionPane.ERROR_MESSAGE);
				}
			}
		});
		btnInserirDepto.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				new AppDepartamentoNovoGui();
			}
		});
	}
	
	public void MontaPartic() {
		tableListaPartic = new JTable(tableModelListaPartic);

		tableModelListaPartic.addColumn("Projeto");
		tableModelListaPartic.addColumn("Funcionário");
		tableModelListaPartic.addColumn("Horas trabalhadas");

		scrolTableListaPartic = new JScrollPane(tableListaPartic);
		
		btnInserirPartic = new JButton("Inserir");
		btnAlterarPartic = new JButton("Alterar");
		btnDeletarPartic = new JButton("Deletar");
		
		panelListaParticTable = new JPanel(new GridLayout(1,1));
		panelListaParticTable.add(scrolTableListaPartic);
		
		panelListaParticBtn = new JPanel(new GridLayout(1,2));
		panelListaParticBtn.add(btnInserirPartic);
		panelListaParticBtn.add(btnAlterarPartic);
		panelListaParticBtn.add(btnDeletarPartic);
		
		panelListaPartic = new JPanel(new BorderLayout());
		panelListaPartic.add(panelListaParticTable, BorderLayout.PAGE_START);
		panelListaPartic.add(panelListaParticBtn, BorderLayout.CENTER);
		
		btnDeletarPartic.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				try {
					int id1 = Integer.parseInt(tableListaPartic.getValueAt(
							tableListaPartic.getSelectedRow(), 0).toString());
					int id2 = Integer.parseInt(tableListaPartic.getValueAt(
							tableListaPartic.getSelectedRow(), 1).toString());
					ParticipaDao fd = new ParticipaDao();
					try {
						fd.deletar(id1, id2);
						JOptionPane.showMessageDialog(null, "Registro " + id1
								+ " deletado com sucesso!", "Sucesso",
								JOptionPane.INFORMATION_MESSAGE);
						
						// Gambiarra que tem que ser arrumada! o.O (sem net para pesquisar)
						paneLista.setSelectedIndex(2);
						paneLista.setSelectedIndex(3);
					} catch (Exception e) {
						JOptionPane.showMessageDialog(null,
								"Erro : " + e.getMessage(), "Atenção!",
								JOptionPane.ERROR_MESSAGE);
					}
				} catch (Exception e) {
					JOptionPane.showMessageDialog(null,
							"Selecione 1 (um) registro. Erro : " + e.getMessage(), "Atenção!",
							JOptionPane.ERROR_MESSAGE);
				}
			}
		});
		btnInserirPartic.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				new AppParticipaNovoGui();
			}
		});
	}
}
